<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>

</html>
<script>
    //JS的编译和执行
    //一.JS的解析过程分为两个阶段：预编译期(预处理)与执行期。
    //第一步：预编译期(预处理) - 代码进入浏览器逐行执行之前干的事情。
    //1.先找var和function关键字，如果找到var关键字，提前赋值undefined给变量名称.如果找到function，提前将整个函数赋值给函数名称。
    //2.如果变量名和函数名重名了，函数名优先(函数名会覆盖变量名，变量名不存在了);
    //3.函数的参数类似于变量，函数内部同样做预编译，支持预编译。
    //4.if语句和for语句里面的变量和函数做预解析提前赋值undefined,函数声明不会跳过。 - 少见(尽量不要在if语句和for语句里面使用函数)

    //第二步：逐行执行，根据代码的顺序执行代码，遇到错误终止。(函数声明跳过).


    //测试1：
    // fn(); //我是函数
    // console.log(a); //undefined
    // var a = 1;
    // console.log(a); //1

    // function fn() {
    //     console.log('我是函数');
    // }
    // fn(); //我是函数

    //变量提升：预编译造成的。
    //普通函数如何地方进行调用：预编译造成的。


    // 测试2
    // console.log(b); //function b() {console.log('我是b函数');}
    // var b = 1;
    // console.log(b); //1
    // function b() {
    //     console.log('我是b函数');
    // }
    // console.log(b); //1

    // 测试3,函数内部也要做预编译。

    // function fn() {
    //     console.log(a); //undefined
    //     var a = 1;
    //     console.log(a); //1
    // }
    // fn();


    // var a = 1;

    // function fn() {
    //     console.log(a); //1
    // }
    // fn();
    // console.log(a); //1



    // var a = 1;

    // function fn() {
    //     a = 3;
    //     console.log(a); //3
    // }
    // fn();
    // console.log(a); //3


    // var a = 1;
    // function fn(a) { //函数内部做预编译(var a = 1)
    //     a = 4;
    //     console.log(a); //4
    // }
    // fn(a); //将外面的a=1
    // console.log(a); //1




    //测试4:函数名相同的预编译是下面的优先，下面的覆盖上面的。
    // console.log(a); //function a() {console.log('函数3');}
    // var a = 1;
    // console.log(a); //1

    // function a() {
    //     console.log('函数1');
    // }
    // console.log(a); //1
    // var a = function() { //这里是变量的预编译，不是函数。
    //     console.log('函数2');
    // }
    // console.log(a); //function() { console.log('函数2');}
    // var a = 3;
    // console.log(a); //3

    // function a() {
    //     console.log('函数3');
    // }
    // console.log(a); //3


    //测试5:
    // console.log(a); //undefined
    // if (false) {
    //     var a = 1;
    // }
    // console.log(a); //undefined


    // console.log(a); //undefined
    // if (true) {
    //     var a = 1;
    // }
    // console.log(a); //1


    // console.log(fn); //undefined
    // if (true) {
    //     function fn() {
    //         console.log('函数');
    //     }
    // }
    // console.log(fn); //function fn() {console.log('函数');}
</script>